// 传入一个promise，原样返回
var promise = ajax('api/users.json')
var promise2 = Promise.resolve(promise)
console.log(promise === promise2)
// 第三方 thenable promise对象转成原生的promise
// 非原生和原生 obj instanceof Promise
// thenable  传入对象 而且有then方法 接口的概念~~~~
// Promise.resolve把thenable的对象转化成为Promise
Promise.resolve({
  // then 有一个签名 几个参数 什么类型的参数 返回什么？
  then: function (onFulfilled, onRejected) {
    onFulfilled('foo')
  },
}).then(function (val) {
  console.log(val)
})

// 怎么检查是否是thenable？
const isThenable = (p) => {
  if (
    p !== null &&
    (typeof p === 'object' || typeof p === 'function') &&
    typeof p.then === 'function'
  ) {
    //thenable
  } else {
    //非thenable
  }
}

// thenable判断和嵌套 => Promise.all
function Promise() {}
Promise.all = (arr) => {
  let result = []
  return new Promise((resolve, reject) => {
    for (let i = 0; i < arr.length; i++) {
      Promise.resolve(arr[i])
      // 如果是promise对象，thenable必须全部返回resolve，否则返回reject
      if (isPromise(arr[i])) {
        arr[i].then((data) => {
          result[i] = data
          if (result.length === arr.length) {
            resolve(result)
          }
        },  error => {
          reject(error)
        })
      } else {
        // 如果不能没有可以resolve的对象了，原样返回就OK了
        result[i] = arr[i]
      }
    }
  })
}
// 实例方法,创建具体的对象才能点出来
P.prototype.then = function() {}
P() {
  this.then = function() {}
}
P.all = function() {}
// 静态方法
// static 静态方法
// function给对象挂成员
// new就是构造函数
class P {
  static all () {
    // Promise.all的实现
  }
}

Promise.all = (arr) => {
  let result = []
  return new Promise((resolve, reject) => {
    for (let i = 0; i < arr.length; i++) {
      Promise.resolve(arr[i])
      // 如果是promise对象，thenable必须全部返回resolve，否则返回reject
      arr[i].then((data) => {
        result[i] = data
        if (result.length === arr.length) {
          resolve(result)
        },
        error => {
          reject(error)
        })
      }
    }
  )
}